package org.example.study2;

public class Demo_207_Revise1 {
        public static void main(String[] args) throws InterruptedException {
            // 创建新线程
            Thread thread = new Thread(() -> {
                // 循环检查线程中断状态
                // 通过线程对象内部维护的中断标识，判断当前线程是否需要中断
                while (!Thread.currentThread().isInterrupted()) {
                    System.out.println("张三转账处理中...");

                    // 线程大部分时间在sleep
                    try {
                        // 线程休眠1秒（此时可能被中断）
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // 当sleep被中断时会抛出异常
                        e.printStackTrace();
                        System.out.println("休眠被中断");
                        break;// 捕获中断异常后直接跳出循环
                    }
                }
                System.out.println("转账终止");
            },"张三");

            // 线程启动前存活状态
            System.out.println("线程是否存活：" + thread.isAlive());// false（尚未启动）
            System.out.println("主线程: 启动张三转账");
            thread.start();//启动线程
            // 主线程休眠1秒（确保子线程进入sleep状态）
            Thread.sleep(1000);
            System.out.println("线程是否存活：" + thread.isAlive());// true（正在运行）
            // 中断线程，发出中断信号（将中断sleep状态）
            System.out.println("主线程: 紧急通知！对方是骗子，停止转账！");
            thread.interrupt();
            // 等待线程销毁
            thread.join(); // 主线程短暂休眠（等待子线程处理中断）
            // 查看最终存活状态
            System.out.println("线程是否存活：" + thread.isAlive());

        }
}
//主线程启动 -> 子线程循环 -> sleep被中断 -> 打印异常 -> break跳出循环 -> 输出"转账终止"
/*中断处理缺陷
        当Thread.sleep()被中断时，会抛出InterruptedException并清除中断标记。
        虽然通过break跳出了循环，但线程的中断状态已被重置为false。
        后续while(!isInterrupted)检查失效，实际靠异常处理逻辑终止。*/
/*
线程是否存活：false
主线程: 启动张三转账
张三转账处理中...
张三转账处理中...
线程是否存活：true
主线程: 紧急通知！对方是骗子，停止转账！
休眠被中断
转账终止
线程是否存活：false
java.lang.InterruptedException: sleep interrupted
	at java.base/java.lang.Thread.sleep(Native Method)
	at org.example.study2.Demo_207_Revise1.lambda$main$0(Demo_207_Revise1.java:15)
	at java.base/java.lang.Thread.run(Thread.java:842)*/
